#include "red_socketcliente.h"

namespace red {
namespace sockets {

SocketCliente::SocketCliente(const string &p_sHost, unsigned int p_wPort) {

	if (!this->create()) {
	} else if (!this->connect(p_sHost, p_wPort)) {
		this->close();
	} else {
		this->setUtilizable(true);
	}
}

bool SocketCliente::connect(const string &p_sHost, unsigned int p_wPort) {

	int t_iRes; //Resultado que me devuelve el connect.
	//Estructura que es necesario rellenar antes de utilizarla para hacer el connect.
	hostent *t_p_hostent = ::gethostbyname(p_sHost.c_str());
	bool t_b = false; //Valor que devuelve esta función.

	//Si el socket es valido y la estructura ha sido inicializada correctamente.
	if ((this->isValid()) && (t_p_hostent != NULL)) {

		//Lleno la estructura.
		this->m_sockaddr_in.sin_family = AF_INET;
		this->m_sockaddr_in.sin_addr = *reinterpret_cast<in_addr *>(t_p_hostent->h_addr);
		this->m_sockaddr_in.sin_port = htons(p_wPort);

		//Realizo el connect.
		t_iRes = ::connect(this->m_Socket, reinterpret_cast<sockaddr *>(&this->m_sockaddr_in),
			sizeof(this->m_sockaddr_in));

		//El connect me devuelve -1 si ha habido algún error.
		if (t_iRes != -1) {
			t_b = true;
		}
	}

	return t_b;
}

}
}
